//
//  ViewController.swift
//  MVP1
//
//  Created by 李煜 on 2024/6/20.

import UIKit

//以下是一个使用 Swift 实现 MVP 模式的简单示例，假设有一个登录界面：
// MARK: - 模型
protocol LoginModelProtocol {
	func login(username: String, password: String, completion: @escaping (Bool) -> Void)
}

class LoginModel: LoginModelProtocol {
	func login(username: String, password: String, completion: @escaping (Bool) -> Void) {
			// 模拟登录逻辑，这里简单判断用户名和密码是否都为 "admin"
		if username == "admin" && password == "admin" {
			completion(true)
		} else {
			completion(false)
		}
	}
}

	// MARK: - 视图
protocol LoginViewProtocol: AnyObject {
	func showLoading()
	func hideLoading()
	func showLoginSuccess()
	func showLoginFailure(errorMessage: String)
}

class LoginViewController: UIViewController, LoginViewProtocol {
	var presenter: LoginPresenterProtocol!
	
	@IBOutlet weak var usernameTextField: UITextField!
	
	@IBOutlet weak var passwordTextField: UITextField!
	
	@IBOutlet weak var loginButton: UIButton!
	
	@IBAction func loginButtonTapped(_ sender: UIButton) {
		presenter.login(username: usernameTextField.text ?? "", password: passwordTextField.text ?? "")
	}
	
	override func viewDidLoad() {
		usernameTextField.text = "admin"
		passwordTextField.text = "admin"
		presenter = LoginPresenter(model: LoginModel(), view: self)
	}
	
		
	// MARK: LoginViewProtocol
	func showLoading() {
			// 显示加载指示器
		debugPrint("显示加载指示器")
	}
	
	func hideLoading() {
			// 隐藏加载指示器
		debugPrint("隐藏加载指示器")
	}
	
	func showLoginSuccess() {
			// 显示登录成功的提示
		debugPrint("显示登录成功指示")
	}
	
	func showLoginFailure(errorMessage: String) {
			// 显示登录失败的提示
		debugPrint("显示登录失败指示")
	}
}

// MARK: - Presenter
protocol LoginPresenterProtocol {
	func login(username: String, password: String)
}

class LoginPresenter: LoginPresenterProtocol {
	let model: LoginModelProtocol
	weak var view: LoginViewProtocol?
	
	init(model: LoginModelProtocol, view: LoginViewProtocol) {
		self.model = model
		self.view = view
	}
	
    //网络请求-登录
	func login(username: String, password: String) {
		view?.showLoading()
		model.login(username: username, password: password) { success in
			self.view?.hideLoading()
			if success {
				self.view?.showLoginSuccess()
			} else {
				self.view?.showLoginFailure(errorMessage: "登录失败，请检查用户名和密码")
			}
		}
	}
}
//在上述示例中：
//
//• LoginModel 负责处理登录的业务逻辑。
//
//• LoginViewController 作为视图，负责展示界面和接收用户输入，并通过 Presenter 进行登录操作。
//
//• LoginPresenter 协调模型和视图之间的交互。
